{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import scipy\n",
    "from scipy.signal import firwin\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"生成滤波器的系数\"\n",
    "def generate_win_coeffs(M, P, window_fn=\"hamming\"):    #M：taps、P:branches、窗函数类型\n",
    "        win_coeffs = scipy.signal.get_window(window_fn, M*P)   \n",
    "        #返回给定类型和长度的窗，窗口的样本数量M*P，这是一个数组\n",
    "        sinc       = scipy.signal.firwin(M * P, cutoff=1.0/P, window=\"hamming\")   \n",
    "        #sinc函数                                                                              \n",
    "        #采用窗函数法设计FIR滤波器，这个函数计算FIR滤波器的系数。\n",
    "        #滤波器的长度（系数的数目）为M*P；滤波器的截止频率  \n",
    "        win_coeffs *= sinc   #样本数量和FIR滤波器系数相乘\n",
    "        win_coeffs = np.reshape(win_coeffs, (P, -1), order='F')\n",
    "        f=open(\"win_coeffs.txt\",'w')\n",
    "        f.write(win_coeffs)\n",
    "        #print(win_coeffs)\n",
    "        f.close()\n",
    "        return win_coeffs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "write() argument must be str, not numpy.ndarray",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32mC:\\Users\\ZHANGM~1\\AppData\\Local\\Temp/ipykernel_276/175713206.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mwin_coeffs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgenerate_win_coeffs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m4\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mwindow_fn\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"hamming\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32mC:\\Users\\ZHANGM~1\\AppData\\Local\\Temp/ipykernel_276/4284300260.py\u001b[0m in \u001b[0;36mgenerate_win_coeffs\u001b[1;34m(M, P, window_fn)\u001b[0m\n\u001b[0;32m     10\u001b[0m         \u001b[0mwin_coeffs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mwin_coeffs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mP\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0morder\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'F'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     11\u001b[0m         \u001b[0mf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"win_coeffs.txt\"\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'w'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 12\u001b[1;33m         \u001b[0mf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mwin_coeffs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     13\u001b[0m         \u001b[1;31m#print(win_coeffs)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     14\u001b[0m         \u001b[0mf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mTypeError\u001b[0m: write() argument must be str, not numpy.ndarray"
     ]
    }
   ],
   "source": [
    "win_coeffs = generate_win_coeffs(100, 4, window_fn=\"hamming\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x22f1dccbc48>]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(win_coeffs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "PFB：多相分解前端\n",
    "输入信号x（矩阵），这里x是M*P的倍数\n",
    "窗函数系数\n",
    "整数M，即taps\n",
    "整数P,即分支数（branches）\n",
    "return:按照(time,branch)返回数据\n",
    "\"\"\"\n",
    "def pfb_fir_frontend(x, win_coeffs, M, P):   \n",
    "    W = int(x.shape[0] / M / P)     #长度为P的窗的个数\n",
    "    x_p = x.reshape((W*M, P)).T     #在输入信号x上多相分解，得到一组分支x_p，P行，W*M列\n",
    "    h_p = win_coeffs.reshape((M, P)).T     #同样把窗函数系数分为分支，为P行，M列\n",
    "    x_summed = np.zeros((P, M*W-M))   #实例化一个空数组来存储信号yn(n'),比原来的x_p要短一些(因为它需要几个周期的taps填满数据)\n",
    "    #在每一个时间步长乘以滤波器系数                                   \n",
    "    for t in range(0, M*W-M):   \n",
    "        x_weighted = x_p[:, t:t+M] * h_p  #从每个分支取M个样本，将其与滤波器系数相乘，需要遍历x_p数组，因此需要循环\n",
    "        x_summed[:, t] = x_weighted.sum(axis=1)  #对taps求和，1轴相加\n",
    "    x_summed=x_summed.T\n",
    "    return x_summed  #返回数据，并进行转置，使坐标轴返回(time,branch)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'numpy.ndarray'>\n",
      "[0.         0.3129618  0.59448077 0.81627311 0.95605566 0.99978466\n",
      " 0.94306673 0.79160024]\n",
      "<class 'numpy.ndarray'>\n",
      "[0.00133891 0.26096234 0.4832636  0.00903766]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1f27c0c7fc8>]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "M = 2\n",
    "P = 2\n",
    "x = np.sin(np.arange(0, M*P*2) / np.pi)\n",
    "print(type(x))\n",
    "print(x)\n",
    "win_coeffs = generate_win_coeffs(M, P, window_fn=\"hamming\")\n",
    "print(type(win_coeffs))\n",
    "print(win_coeffs)\n",
    "plt.plot(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "taps: 2\n",
      "branches: 2\n",
      "Input signal shape: 8\n",
      "Window shape:       4\n",
      "Output data shape(乘加后的点数，FFT之前的点数): (2, 2)\n",
      "y_p的值 [[0.28729092 0.08904844]\n",
      " [0.46282285 0.22205225]]\n"
     ]
    }
   ],
   "source": [
    "y_p = pfb_fir_frontend(x, win_coeffs, M, P)\n",
    "\n",
    "print(\"taps: %i\" % M)\n",
    "print(\"branches: %i\" % P)\n",
    "print(\"Input signal shape: %i\" % x.shape)\n",
    "# f=open(\"win_coeffs.txt\",'w')\n",
    "# f.write(str(win_coeffs))\n",
    "print(\"Window shape:       %i\" % win_coeffs.shape)\n",
    "print(\"Output data shape(乘加后的点数，FFT之前的点数): %s\" % str(y_p.shape))\n",
    "print(\"y_p的值\",y_p)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "plt.imshow(y_p)\n",
    "plt.xlabel(\"Branch\")\n",
    "plt.ylabel(\"Time\")\n",
    "\n",
    "plt.figure()\n",
    "for i in range(0,P):\n",
    "    plt.plot(y_p[i], label=\"p=%d\"%i)\n",
    "\n",
    "plt.xlabel(\"Time sample, $n'$\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fft(x_p, P, axis=1):\n",
    "    return np.fft.rfft(x_p, P, axis=axis)\n",
    "\n",
    "def pfb_filterbank(x, win_coeffs, M, P):\n",
    "    x_fir = pfb_fir_frontend(x, win_coeffs, M, P)\n",
    "    x_pfb = fft(x_fir, P)\n",
    "    return x_pfb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'np' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32mC:\\Users\\ZHANGM~1\\AppData\\Local\\Temp/ipykernel_276/2691888391.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[0mM\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[0mP\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mx\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m6\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m7\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m9\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      4\u001b[0m \u001b[0mwin_coeffs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[0mW\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0mM\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0mP\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'np' is not defined"
     ]
    }
   ],
   "source": [
    "\n",
    "M=2\n",
    "P=2\n",
    "x=np.array([1,2,3,4,5,6,7,8])\n",
    "win_coeffs=np.array([1,1,1,1])\n",
    "W = int(x.shape[0] / M / P)     \n",
    "x_p = x.reshape((W*M, P)).T \n",
    "print(\"输入信号重排后\",x_p)    \n",
    "h_p1 = win_coeffs.reshape((M, P)).T  \n",
    "print(\"滤波器系数重排后\",h_p1)   \n",
    "x_summed = np.zeros((P, M*W-M))                  \n",
    "for t in range(0, M*W-M):   \n",
    "    x_weighted = x_p[:, t:t+M] * h_p1  \n",
    "    print(\"从每个分支取M个样本，与滤波器系数相乘,得\",x_weighted)\n",
    "    x_summed[:, t] = x_weighted.sum(axis=1)  \n",
    "    print(\"相加,得\",x_weighted)\n",
    "x_summed=x_summed.T\n",
    "#y_p1 = pfb_fir_frontend(x, win_coeffs, M, P)\n",
    "print(x_summed)\n",
    "before_fft=pfb_filterbank(x, win_coeffs, M, P)\n",
    "print(\"FFT之后点的\",before_fft)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def db(x):\n",
    "    \"\"\" Convert linear value to dB value \"\"\"\n",
    "    return 10*np.log10(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\install\\Python37\\lib\\site-packages\\matplotlib\\cbook\\__init__.py:1333: ComplexWarning: Casting complex values to real discards the imaginary part\n",
      "  return np.asarray(x, float)\n",
      "D:\\install\\Python37\\lib\\site-packages\\matplotlib\\cbook\\__init__.py:1333: ComplexWarning: Casting complex values to real discards the imaginary part\n",
      "  return np.asarray(x, float)\n",
      "D:\\install\\Python37\\lib\\site-packages\\matplotlib\\cbook\\__init__.py:1333: ComplexWarning: Casting complex values to real discards the imaginary part\n",
      "  return np.asarray(x, float)\n",
      "D:\\install\\Python37\\lib\\site-packages\\matplotlib\\cbook\\__init__.py:1333: ComplexWarning: Casting complex values to real discards the imaginary part\n",
      "  return np.asarray(x, float)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "M, P= 6, 512                  # taps, channels, windows\n",
    "period = np.linspace(0, 0.025, 101)\n",
    "\n",
    "chan0_val = []\n",
    "chan1_val = []\n",
    "chan2_val = []\n",
    "chan3_val = []\n",
    "win_coeffs = generate_win_coeffs(M, P, window_fn=\"hamming\")\n",
    "for p in period:\n",
    "    t = np.arange(0, M*P*W)\n",
    "    x = np.sin(t * p) + 0.001\n",
    "    X_psd=pfb_filterbank(x, win_coeffs, M, P)\n",
    "    chan0_val.append(X_psd[0, 0])\n",
    "    chan1_val.append(X_psd[0, 1])\n",
    "    chan2_val.append(X_psd[0, 2])\n",
    "    chan3_val.append(X_psd[0, 3])\n",
    "    \n",
    "    \n",
    "plt.plot(period, db(chan0_val))\n",
    "plt.plot(period, db(chan1_val))\n",
    "plt.plot(period, db(chan2_val))\n",
    "plt.plot(period, db(chan3_val))\n",
    "plt.xlim(period[0], period[-1])\n",
    "plt.ylabel(\"Power [dB]\")\n",
    "plt.xlabel(\"Input sine wave period\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "025ea33c0f928a4c0267c781cfd95d8c390c0ea0da6a24224ad21c94028fa66d"
  },
  "kernelspec": {
   "display_name": "Python 3.7.4 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
